package modelo;

import java.util.Calendar;
import java.util.List;

import models.Alimento;
import models.Comible;
import models.ComidaPlan;
import models.Genero;
import models.Nutri;
import models.Plan;
import models.PorcionPlan;
import models.TemplatePlan;
import models.TipoAlimento;
import models.TipoComida;
import models.TipoPlan;
import models.UnidadPorcion;
import models.Usuario;

/**
 * El objetivo de esta clase es crear datos estaticos para las pruebas.
 * Creo objetos completos para usar en las pruebas.  
 * Estos datos NO están persistidos, asi que si necesitan guardarlos en
 * la base de datos, primero invocan al metodo que los crea y despues le
 * hacen un ".save"
 * 
 * Agreguen los metodos que necesiten:
 * 		Cuanto mas tengamos, mejor.
 * 		Cuanto mas genericos sean, mejor.
 * 
 * */
public class DatosParaPruebas {
	
	public static Usuario usuarioBob() {
		return new Usuario("usuario" + (int)Math.random() + "@gmail.com", "secret", "Bob");
	}
	
	public static Plan plan2000Calorias(Usuario usuario) {
		
		Calendar fechaInicio = Calendar.getInstance();
		Calendar fechaFin = Calendar.getInstance();
		
		fechaInicio.set(2012, 06, 06);
		fechaFin.set(2012, 06, 10);
		
		Plan plan = new Plan(usuario);
		
		plan.setCaloriasDiarias(2000);
		plan.setFechaInicio(fechaInicio.getTime());
		plan.setFechaFin(fechaFin.getTime());
		plan.setNombre("Plan de Prueba" + Math.random());
		
		return plan;
	}
	
	/**
	 * Devuelve una comidaPlan completo con 3 porciones random adentro
	*/
	public static ComidaPlan comidaPlan(TipoComida tipoComida) {
		
		ComidaPlan comida = new ComidaPlan();
		
		comida.setTipo(tipoComida);
		comida.agregarPorcionPlan(porcionPlanRandom());
		comida.agregarPorcionPlan(porcionPlanRandom());
		comida.agregarPorcionPlan(porcionPlanRandom());
		
		return comida;
	}
	
	/**
	 * Crea porciones de generos que tengan algun alimento en la base de datos
	 * */
	public static PorcionPlan porcionPlanRandom() {
		
		PorcionPlan porcion = new PorcionPlan();
		Genero genero = Genero.ALMIDONES;
		Boolean tengoAlimento = Boolean.FALSE;
		
		while( ! tengoAlimento) {
			
			genero = Genero.values()[(int)(Math.random() * Genero.values().length)];
			
			// me fijo que exista almenos algun alimento con ese genero
			for (TipoAlimento tipoAlimento : TipoAlimento.values()) {
				if (genero.equals(tipoAlimento.getGenero())) {
					tengoAlimento = ! Alimento.find("byTipoElike", tipoAlimento).fetch().isEmpty();
				}
			}
			
		}
		
		porcion.setGenero(genero);
		porcion.setCantidadDePorciones((int)(Math.random() * 5));
		
		return porcion;
	}
	
	public static Alimento alimentoPolloAlHorno() {
		
		Alimento pollo = new Alimento("Pollo al horno");
		
		pollo.setTipo(TipoAlimento.POLLO);
		pollo.setUnidadPorcion(UnidadPorcion.GRAMOS);
		pollo.setGramosPorPorcion(100);
		pollo.setCaloriasPorPorcion(113);
		pollo.setCantidadUnidadesPorcion(1);
		
		return pollo;
	}
	
	public static Alimento alimentoPureDePapas() {
		
		Alimento pure = new Alimento("Pure de papas");
		
		pure.setTipo(TipoAlimento.VEGETALES_FECULENTOS);
		pure.setUnidadPorcion(UnidadPorcion.TAZA);
		pure.setGramosPorPorcion(85);
		pure.setCaloriasPorPorcion(64);
		pure.setCantidadUnidadesPorcion(1);
		
		return pure;
	}
	
	public static Alimento alimentoFideos() {
		
		Alimento fideos = new Alimento("Fideos");
		fideos.setCaloriasPorPorcion(150);
		fideos.setUnidadPorcion(UnidadPorcion.GRAMOS);
		fideos.setGramosPorPorcion(100);
		fideos.setTipo(TipoAlimento.PASTAS);
		fideos.setCantidadUnidadesPorcion(1);
		
		return fideos;
	}

	public static TemplatePlan templatePlan2000CaloriasVegetariano() {
		
		Nutri autor = new Nutri();
		autor.setNombre("Lic. Cosme Fulanito");
		
		TemplatePlan templatePlan = new TemplatePlan();
		
		templatePlan.setNombre("templateVegetariano1");
		templatePlan.setCaloriasDiarias(2000);
		templatePlan.setAutor(autor);
		templatePlan.setTipo(TipoPlan.VEGETARIANO);
		
		for (TipoComida tipo : TipoComida.values()) {
			ComidaPlan comida = DatosParaPruebas.comidaPlan(tipo);
			templatePlan.getComidasPlan().add(comida);
		}
		
		return templatePlan;
	}
	
}
